void DBTableWidget::paintEvent(QPaintEvent *e)
{
    QTableWidget::paintEvent(e);
    //绘制网格线
    QPainter painter(viewport());
    //保存QPainter对象
    painter.save();
    QPen pen = painter.pen();
    pen.setWidth(1);
    for (int i=0;i<rowCount();i++)
    {
        for (int j =0 ;j < columnCount();j++)
        {
            if(this->item(i,j) == NULL)
                return;
            QModelIndex modelIndex = indexFromItem(this->item(i,j));
            //QRect类提供各种矩形坐标，绘制线跟点的时候需要用到坐标
            QRect rect = visualRect(modelIndex);
            QRect tmpRect = rect;
 
            //如果是选中状态 并且在选择公式状态
            if (this->item(i,j)->isSelected())
            {
                //给选中单元格进行画线画点
                QVector<qreal>dashes;
                QPen penXu = painter.pen();
                //设置画笔宽度
                penXu.setWidth(2);
                QColor color;
                //设置画笔颜色
                color.setRgb(31,187,125);
                penXu.setColor(color);
                painter.setPen(penXu);
                //绘制单元格四周的线
                painter.drawRect(tmpRect);
                //绘制单元格右下角点
                penXu.setWidth(6);
                painter.setPen(penXu);
                painter.drawPoint(tmpRect.x()+tmpRect.width() -3,tmpRect.y()+tmpRect.height()-3);
            }
        }
    }
    //恢复QPainter对象
    painter.restore();
    this->viewport()->update();
}
//鼠标移动事件
void DBTableWidget::mouseMoveEvent(QMouseEvent *event)
{
    //获取鼠标位置信息
    QPoint mousePos =  event->pos();
    //获取所有选中单元格
    QList<QTableWidgetItem*> itemList = this->selectedItems();
    //没有选中单元格 就退出
    if (itemList.size() <= 0)
        return;
    QModelIndex modelIndex = indexFromItem(itemList[itemList.size()-1]);
    //获取最后一个选中的单元格的QRect，用来判断是否鼠标位置是否在右下角区域
    QRect rect = visualRect(modelIndex);
    //判断是否在我们规定的区域，或者是按下模式，isClick是按下模式标志
    if((mousePos.rx() >= (rect.x()+rect.width() -7) && mousePos.rx() <= (rect.x()+rect.width())
        && mousePos.ry() >= (rect.y()+rect.height()-7) && mousePos.ry() <= (rect.y()+rect.height()))
        || m_isCellBottomRightClick )
    {
        //设置鼠标在右下角区域样式
        this->setCursor(Qt::SizeAllCursor);
        //在右下角区域
        m_isCellBottomRight = true;
        //是否是按下拖拽模式
        if (m_isCellBottomRightDrag)
        {
            //如果是按下拖拽模式，则对当前选中的item进行数据设置，本人此处ToAddString函数则是递增函数
            if (itemList.size() > 1)
            {
                QString strText = itemList[itemList.size()-2]->text();
                bool isNum = false;
                double val = strText.toDouble(&isNum); 
                QString strTextLast;
                //如果是数字加1 否则复制文本
                if (isNum)
                    strTextLast = QString::number(val+1);
                else
                {
                    //查看是否末尾是数字
                    QRegExp rx("\\d+$");
                    rx.indexIn(strText, 0);
                    QString end_num = rx.cap(0);
                    //查看是否最前面是数字
                    QRegExp rx1("^\\d+");
                    rx1.indexIn(strText, 0);
                    QString start_num = rx1.cap(0);
                    if (!start_num.isEmpty())
                        strText.replace(start_num, QString::number(start_num.toInt()+1));
                    else if (!end_num.isEmpty())
                    {
                        int strIndex = strText.lastIndexOf(end_num);
                        QString strMid = strText.mid(0,strIndex);
                        strText = strMid + QString::number(end_num.toInt()+1);
                    }
                    strTextLast = strText;
                }
                //这边撤销恢复方法需要记录的修改过的单元格 你们可以直接掠过
                //if (strTextLast != itemList[itemList.size()-1]->text())
               // {
               //     CellText info;
                //    info.row = itemList[itemList.size()-1]->row();
                //    info.col = itemList[itemList.size()-1]->column();
                //    info.strStart = itemList[itemList.size()-1]->text();
                 //   info.strEnd = strTextLast;
                 //   m_cellCellBottomRightDragContainer.cellInfos.push_back(info);
                    //设置值
                //    itemList[itemList.size()-1]->setText(strTextLast);
                }
            }
        }
    }
    else
    {
        //不在右下角矩形范围内
        m_isCellBottomRight = false;
         //范围之外变回原来形状
        this->setCursor(Qt::ArrowCursor);     
 
    }
    //提交鼠标给QTableWidget控件，否则QTableWidget控件监测不到鼠标后以上代码则做无用功
    QTableWidget::mouseMoveEvent(event);
 
}
//鼠标点击事件
void DBTableWidget::mousePressEvent(QMouseEvent *event)
{
    //确保按下的是鼠标左键且是在选中框右下角
    if(event->button()==Qt::LeftButton && m_isCellBottomRight)
    {
        //设置为鼠标样式，防止鼠标在拖动的过程中由于鼠标样式改变，导致数据设置失败
        this->setCursor(Qt::SizeAllCursor);
        //是左键按下模式
        m_isCellBottomRightClick = true;
 
        //确保当前按下鼠标左键选中的单元格有内容，否则拖拽自增数据无效
        if(!this->currentIndex().data().isNull() && this->currentIndex().data().toString().size() > 0)
            m_isCellBottomRightDrag = true;
    }
    else
    {
        //不是左键按下模式
        m_isCellBottomRightClick = false;
        this->setCursor(Qt::ArrowCursor);
    }
 
    QTableWidget::mousePressEvent(event);//提交鼠标给控件
}
//鼠标释放触发
void DBTableWidget::mouseReleaseEvent(QMouseEvent *ev){
    //格式刷功能 直接跳过
    //if (m_isFormatting)
    //{        
        //代表鼠标左键松下
       // if(ev->button()==Qt::LeftButton){
         //   emit formattingCloseSignal();
       //    setFormatting(false); 
       // }
    }
    //松开之前是鼠标在单元格右下角区域按下模式，释放各种参数
    if(m_isCellBottomRightClick)
    {
        m_isCellBottomRightClick = false;
        m_isCellBottomRightDrag = false;
        m_isCellBottomRight = false;
        //设置鼠标样式
        this->setCursor(Qt::ArrowCursor);
        QList<QTableWidgetItem*> itemList = this->selectedItems();
        //将当前选择的单元格还给拖拽前点击的单元格
        if (itemList.size() > 0)
            this->setCurrentItem(itemList[0]);
        if (m_cellCellBottomRightDragContainer.cellInfos.size() > 0)
        {
            QVariant variant = QVariant::fromValue(m_cellCellBottomRightDragContainer);
            emit eventSignal(variant);
            m_cellCellBottomRightDragContainer.cellInfos.clear();
        }
    }
    //提交鼠标给控件
    QTableWidget::mouseReleaseEvent(ev);
}
